﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Common.Mef.Attributes
{
    //
    // 摘要:
    //     指定某个类型、属性、字段或方法提供特定的导出。
    [AttributeUsage(
        AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field,
        AllowMultiple = true, Inherited = false)]
    public class CustomInjectionAttribute : Attribute
    {
        //
        // 摘要:
        //     通过在默认协定名称下导出使用此特性标记的类型或成员，初始化 System.ComponentModel.Composition.ExportAttribute
        //     类的新实例。
        public CustomInjectionAttribute()
        {

        }

        //
        // 摘要:
        //     通过在派生自指定类型的协定名称下导出使用此特性标记的类型或成员，初始化 System.ComponentModel.Composition.ExportAttribute
        //     类的新实例。
        //
        // 参数:
        //   contractType:
        //     从中派生用于导出使用此特性标记的类型或成员的协定名称的类型，或 null 以使用默认协定名称。
        public CustomInjectionAttribute(Type contractType)
        {
            ContractType = contractType;
        }

        //
        // 摘要:
        //     通过在指定的协定名称下导出用此属性标记的类型或成员，来初始化 System.ComponentModel.Composition.ExportAttribute
        //     类的新实例。
        //
        // 参数:
        //   contractName:
        //     用于导出使用此特性标记的类型或成员的协定名称，或 null 或空字符串 ("") 以使用默认协定名称。
        public CustomInjectionAttribute(string contractName)
        {
            ContractName = contractName;
        }

        //
        // 摘要:
        //     通过在指定协定名称下导出指定类型，初始化 System.ComponentModel.Composition.ExportAttribute 类的新实例。
        //
        // 参数:
        //   contractName:
        //     用于导出使用此特性标记的类型或成员的协定名称，或 null 或空字符串 ("") 以使用默认协定名称。
        //
        //   contractType:
        //     要导出的类型。
        public CustomInjectionAttribute(string contractName, Type contractType)
        {
            ContractName = contractName;
            ContractType = contractType;
        }

        //public ExportAttribute(string contractName, Type contractType, bool useCustomContainer = false)
        //{
        //    ContractName = contractName;
        //    ContractType = contractType;
        //    UseCustomContainer = useCustomContainer;
        //}

        /// <summary>
        /// 是否使用自定义容器,多实例不支持
        /// </summary>
        public bool UseCustomContainer { get; set; }

        //
        // 摘要:
        //     获取用于导出使用此特性标记的类型或成员的协定名称。
        //
        // 返回结果:
        //     用于导出使用此特性标记的类型或成员的协定名称。 默认值为空字符串 ("")。
        public string ContractName { get; }

        //
        // 摘要:
        //     获取由此特性附加到的成员导出的协定类型。
        //
        // 返回结果:
        //     提供的导出的类型。 默认值为 null，这表示将通过查看此导出附加到的成员上的类型来获取类型。
        public Type ContractType { get; }
    }
}